<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 因为this的指向为谁调用就指向谁，所以使用call改变函数的执行上下文，可以使得目标对象拥有该方法
        Function.prototype.myCall = function (context, ...args) {
            const fn = Symbol('fn')
            context = context || window // 非严格模式下 指向window
            context[fn] = this // 考虑这里是如何调用的 foo.myCall(obj) this就是函数
            const result = context[fn](...args)
            delete context[fn]
            return result
        }

        function foo() {
            console.log(this.name)
        }

        const obj = {
            name: '舒文俊'
        }
        foo.myCall(obj)

        // args 为剩余参数的集合
        function bar(a, ...args) {
            console.log('a', a)
            console.log('args', args)
        }

        bar(1,2,3,4,5)
    </script>
</body>

</html>